home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1998 January: Mac OS SDK / Dev.CD Jan 98 SDK1.toast / Development Kits (Disc 1) / Open Transport / OT1.1 Developer Release / Open Transport SDK / Open Tpt Client Developer / Samples / Internet / OTDNRSample.cp < prev    next >
Encoding:
Text File  |  1996-11-19  |  20.7 KB  |  737 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        OTDNRSample.cp
  3.  
  4.     Contains:    Sample showing use of the Open Transport MacTCP Domain Name Resolver
  5.  
  6.     Copyright:    © 1994-1995 by Apple Computer, Inc., all rights reserved.
  7.  
  8. */
  9.  
  10. #include <Types.h>
  11. #include <Events.h>
  12. #include <SegLoad.h>
  13. #include <String.h>
  14. #include <strings.h>
  15. #include <Quickdraw.h>
  16. #include <Stdio.h>
  17. #include <StdLib.h>
  18. #include <Desk.h>
  19. #include <OpenTptInternet.h>
  20.  
  21. const UInt16        kNumMX    = 10;
  22. const size_t        kQueryBufSize = 4096;                         
  23. const size_t        kArgBufSize = 8;                                // Support eight argvs 
  24.  
  25. Boolean             gCallCompleted = false;
  26. InetSvcRef             gSvc = NULL;
  27.  
  28. InetDomainName        gDomainName;
  29. InetHostInfo        gMyHInfo;
  30. InetSysInfo            gMySysInfo;
  31. InetMailExchange    gMyMX[kNumMX];
  32. UInt16                gNumMX;    
  33. UInt8                gQueryBuf[kQueryBufSize];
  34. void*                gArgBuf[kArgBufSize];
  35. OTResult            gTestResult = kOTNoError;
  36.  
  37. const int kStrToAddrTest        = 1;
  38. const int kAddrToNameTest        = 2;
  39. const int kSysInfoTest            = 3;
  40. const int kMXTest                = 4;
  41. const int kQueryTest            = 5;
  42. enum
  43. {
  44.     kAType            = 1,
  45.     kNSType            = 2,
  46.     kMDType            = 3,
  47.     kMFType            = 4,
  48.     kCNameType        = 5,
  49.     kSOAType        = 6,
  50.     kMBType            = 7,
  51.     kMGType            = 8,
  52.     kMRType            = 9,
  53.     kNullType        = 10,
  54.     kWKSType        = 11,
  55.     kPtrType        = 12,
  56.     kHInfoType        = 13,
  57.     kMInfoType        = 14,
  58.     kMXType            = 15,
  59.     kTxtType        = 16,
  60.     kRPType            = 17,
  61.     kAFDSBType        = 18,
  62.     kX25Type        = 19,
  63.     kISDNType        = 20,
  64.     kRTType            = 21,
  65.     kAXFRTYpe        = 252,
  66.     kMailBType        = 253,
  67.     kMailAType         = 254,
  68.     kWIldCardType    = 255
  69. };
  70.  
  71. struct WKSEntry 
  72. {
  73.     UInt8    WKSAddr[4];
  74.     UInt8    WKSProto;
  75.     char    WKSBitMask[4];
  76. };
  77. typedef struct WKSEntry WKSEntry;
  78.  
  79.  
  80. const char* TypeOfQuery[256] = {"Unknown", "A", "NS", "MD", "MF", "CNAME",
  81.                                 "SOA", "MB", "MG", "MR", "Null", "WKS",
  82.                                 "PTR", "HINFO", "MINFO", "MX", "TXT", "RP",
  83.                                 "AFDSB", "X25", "ISDN", "RTT",
  84.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  85.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  86.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  87.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  88.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  89.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  90.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  91.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  92.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  93.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  94.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  95.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  96.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  97.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  98.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  99.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  100.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  101.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  102.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  103.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  104.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  105.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  106.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  107.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  108.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  109.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  110.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  111.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  112.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  113.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  114.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  115.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  116.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  117.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  118.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  119.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  120.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  121.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  122.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  123.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  124.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  125.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  126.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  127.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  128.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  129.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  130.                                 "AXFR", "MAILB", "MAILA", "WILDCARD"};
  131.                                 
  132. const char*    TypeOfClass[256] = {"Unknown", "IN", "CS", "CH", "HS",
  133.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  134.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  135.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  136.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  137.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  138.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  139.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  140.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  141.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  142.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  143.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  144.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  145.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  146.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  147.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  148.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  149.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  150.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  151.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  152.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  153.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  154.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  155.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  156.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  157.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  158.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  159.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  160.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  161.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  162.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  163.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  164.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  165.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  166.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  167.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  168.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  169.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  170.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  171.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  172.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  173.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  174.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  175.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  176.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  177.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  178.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  179.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  180.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown", 
  181.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  182.                                 "Unknown", "Unknown", "Unknown", "Unknown", "Unknown",
  183.                                 "WILDCARD"};
  184.  
  185. const char*    TypeOfRR[5] = {"Unknown", "Question", "Answer", "Authority", "Additional"};
  186.  
  187. const char*    TypeOfProtocol[18] = {"Reserved", "ICMP", "IGMP", "GGP", "IP",
  188.                                "ST", "TCP", "UCL", "EGP", "IGP",
  189.                                "BBN-RC-MON", "NVP-II", "PUP", "ARGUS", "EMCON",
  190.                                "XNET", "CHAOS", "UDP"}; // Only Need This Many For Test
  191.  
  192. void Inits()
  193. {
  194.     /*
  195.      * Do standard inits
  196.      */
  197.     InitGraf(&qd.thePort);
  198.     if ( InitOpenTransport() != kOTNoError )
  199.     {
  200.         fprintf(stderr, "dnrtest: Could not initialize ASLM, exiting\n");
  201.         exit(1);
  202.     }
  203. }
  204.  
  205. void CleanMyHInfo()
  206. {
  207.     UInt8* start = (UInt8*)&gMyHInfo;
  208.     size_t idx;
  209.     
  210.     for (idx = 0; idx < sizeof(InetHostInfo); idx++)
  211.         start[idx] = 0;
  212. }
  213.  
  214. void CleanMyDomainName()
  215. {
  216.     UInt8* start = (UInt8*)gDomainName;
  217.     size_t idx;
  218.     
  219.     for (idx = 0; idx < sizeof(gDomainName); idx++)
  220.         start[idx] = 0;
  221. }
  222.  
  223. void CleanMySysInfo()
  224. {
  225.     UInt8* start = (UInt8*)&gMySysInfo;
  226.     size_t idx;
  227.     
  228.     for (idx = 0; idx < sizeof(InetHostInfo); idx++)
  229.         start[idx] = 0;
  230. }
  231.  
  232. void CleanMyMX()
  233. {
  234.     UInt8* start = (UInt8*)gMyMX;
  235.     size_t idx;
  236.     
  237.     for (idx = 0; idx < sizeof(InetMailExchange) * kNumMX; idx++)
  238.         start[idx] = 0;
  239. }
  240.  
  241. void CleanMyQueryBuf()
  242. {
  243.     UInt8* start = (UInt8*)gQueryBuf;
  244.     size_t idx;
  245.     
  246.     for (idx = 0; idx < kQueryBufSize; idx++)
  247.         start[idx] = 0;
  248. }
  249.  
  250. void DoStrToAddr(char* name)
  251. {
  252.     size_t    idx;
  253.     union
  254.     {
  255.         InetHost    addr;
  256.         UInt8        bytes[4];
  257.     } tmpaddr;                
  258.  
  259.     CleanMyHInfo();
  260.     
  261.     OSStatus err = gSvc->StringToAddress(name, &gMyHInfo);
  262.     
  263.     if ( err != kOTNoError )
  264.         gTestResult = err;
  265.     else
  266.     {
  267.         while ( !gCallCompleted )
  268.             ;
  269.     }
  270.     
  271.     switch ( gTestResult )
  272.     {
  273.         case kOTNoError:
  274.             fprintf(stderr, "Canonical Name = %s \n", gMyHInfo.name);
  275.             for ( idx = 0; idx < kMaxHostAddrs; idx++)
  276.             {
  277.                 if ( gMyHInfo.addrs[idx] == NULL )
  278.                     break;
  279.                 tmpaddr.addr = gMyHInfo.addrs[idx];
  280.                 fprintf(stderr, "Address %d = %d.%d.%d.%d \n", idx,
  281.                                  tmpaddr.bytes[0], tmpaddr.bytes[1], 
  282.                                 tmpaddr.bytes[2], tmpaddr.bytes[3]);
  283.             }
  284.             break;
  285.             
  286.         case kENOMEMErr:
  287.             fprintf(stderr, "Memory Depletion!\n");
  288.             break;
  289.             
  290.         case kEINVALErr:
  291.             fprintf(stderr, "Host Address Wrong Size! Shouldn't Happen In This Test!\n");
  292.             break;
  293.             
  294.         case kOTNoDataErr:
  295.             fprintf(stderr, "No Data Available! Either Timeout,or Name Exists But Requested Info Doesn't!\n");
  296.             break;
  297.             
  298.         case kOTBadNameErr:
  299.             fprintf(stderr, "Bad Name! Either Name Does Not Exist in Domains Examined, or Bad Syntax!\n");
  300.             break;
  301.             
  302.         default:
  303.             fprintf(stderr, "Unknown Error!\n");
  304.             break;
  305.     }
  306.     gCallCompleted = false;
  307.     gTestResult = kOTNoError;
  308. }
  309.  
  310.  
  311. void DoAddrToName(InetHost addr)
  312. {
  313.     CleanMyDomainName();
  314.     
  315.     OSStatus err = gSvc->AddressToName(addr, gDomainName);
  316.     
  317.     if ( err != kOTNoError )
  318.         gTestResult = err;
  319.     else
  320.     {
  321.         while ( !gCallCompleted )
  322.             ;
  323.     }
  324.  
  325.     switch ( gTestResult )
  326.     {
  327.         case kOTNoError:
  328.             fprintf(stderr, "Canonical Name = %s \n", gDomainName);
  329.             break;
  330.             
  331.         case kENOMEMErr:
  332.             fprintf(stderr, "Memory Depletion!\n");
  333.             break;
  334.             
  335.         case kEINVALErr:
  336.             fprintf(stderr, "Host Address Wrong Size! How'd That Happen?\n");
  337.             break;
  338.             
  339.         case kOTNoDataErr:
  340.             fprintf(stderr, "No Data Available! Either Timeout,or Name Exists But Requested Info Doesn't!\n");
  341.             break;
  342.             
  343.         case kOTBadNameErr:
  344.             fprintf(stderr, "Bad Address! Either Address Does Not Exist in Domains Examined, or Bad Syntax!\n");
  345.             break;
  346.             
  347.         default:
  348.             fprintf(stderr, "Unknown Error!\n");
  349.             break;
  350.     }
  351.     gTestResult = kOTNoError;
  352.     gCallCompleted = false;
  353. }
  354.  
  355.  
  356. void DoSysInfo(char* name)
  357. {
  358.     CleanMySysInfo();
  359.     
  360.     OSStatus err = gSvc->SysInfo(name, &gMySysInfo);
  361.     
  362.     if ( err != kOTNoError )
  363.         gTestResult = err;
  364.     else
  365.     {
  366.         while ( !gCallCompleted )
  367.             ;
  368.     }
  369.  
  370.     switch ( gTestResult)
  371.     {
  372.         case kOTNoError:
  373.             fprintf(stderr, "CPU Type %s\n", gMySysInfo.cpuType);
  374.             fprintf(stderr, "O/S Type %s\n", gMySysInfo.osType);
  375.             break;
  376.             
  377.         case kENOMEMErr:
  378.             fprintf(stderr, "Memory Depletion!\n");
  379.             break;
  380.             
  381.         case kEINVALErr:
  382.             fprintf(stderr, "Host Address Wrong Size! Shouldn't Happen In This Test!\n");
  383.             break;
  384.             
  385.         case kOTNoDataErr:
  386.             fprintf(stderr, "No Data Available! Either Timeout,or Name Exists But Requested Info Doesn't!\n");
  387.             break;
  388.             
  389.         case kOTBadNameErr:
  390.             fprintf(stderr, "Bad Name! Either Name Does Not Exist in Domains Examined, or Bad Syntax!\n");
  391.             break;
  392.             
  393.         default:
  394.             fprintf(stderr, "Unknown Error!\n");
  395.             break;
  396.     }
  397.     gCallCompleted = false;
  398.     gTestResult = kOTNoError;
  399. }
  400.  
  401.  
  402. void DoMailExchange(char* name)
  403. {
  404.     size_t                idx;
  405.     InetMailExchange*    mailex;
  406.     
  407.     CleanMyMX();
  408.     gNumMX = kNumMX;
  409.     OSStatus err = gSvc->MailExchange( name, &gNumMX, gMyMX);
  410.  
  411.     if ( err != kOTNoError )
  412.         gTestResult = err;
  413.     else
  414.     {
  415.         while ( !gCallCompleted )
  416.             ;
  417.     }
  418.  
  419.     switch ( gTestResult )
  420.     {
  421.         case kOTNoError:
  422.             for ( idx = 0, mailex = gMyMX; idx < kNumMX; idx++, mailex++)
  423.                 if ( mailex->exchange[0] )
  424.                     fprintf(stderr, "Exchange = %s, Preference = %d\n", mailex->exchange, mailex->preference);
  425.             break;
  426.             
  427.         case kENOMEMErr:
  428.             fprintf(stderr, "Memory Depletion!\n");
  429.             break;
  430.             
  431.         case kEINVALErr:
  432.             fprintf(stderr, "Host Address Wrong Size! Shouldn't Happen In This Test!\n");
  433.             break;
  434.             
  435.         case kOTNoDataErr:
  436.             fprintf(stderr, "No Data Available! Either Timeout,or Name Exists But Requested Info Doesn't!\n");
  437.             break;
  438.             
  439.         case kOTBadNameErr:
  440.             fprintf(stderr, "Bad Name! Either Name Does Not Exist in Domains Examined, or Bad Syntax!\n");
  441.             break;
  442.             
  443.         default:
  444.             fprintf(stderr, "Unknown Error!\n");
  445.             break;
  446.     }
  447.     gCallCompleted = false;
  448.     gTestResult = kOTNoError;
  449. }
  450.  
  451. void DoGenericQuery(char* name, UInt16 qclass, UInt16 qtype)
  452. {
  453.     DNSQueryInfo*    qptr;
  454.     int j, i = 0;
  455.     
  456.     CleanMyQueryBuf();
  457.     OSStatus err = gSvc->Query(name, qclass, qtype, (char *)gQueryBuf, kQueryBufSize, 
  458.                                 gArgBuf, kArgBufSize, (OTFlags)0);
  459.  
  460.     if ( err != kOTNoError )
  461.         gTestResult = err;
  462.     else
  463.     {
  464.         while ( !gCallCompleted )
  465.             ;
  466.     }
  467.  
  468.     switch ( gTestResult )
  469.     {
  470.         case kOTBufferOverflowErr:
  471.             fprintf(stderr, "Buffer Overflow! Will print all responses that fit.\n\n");
  472.             // Fall through...
  473.         case kOTNoError:
  474.             qptr = *((DNSQueryInfo**)gArgBuf);
  475.             if (qptr != NULL)
  476.             {
  477.                 fprintf(stderr, "Query Name: %s\n\n", qptr->name);
  478.             }
  479.             while ((qptr != NULL) && (i < kArgBufSize))
  480.             {
  481.                 fprintf(stderr, "Record %d : %s : ", i, TypeOfRR[qptr->responseType]);
  482.                 fprintf(stderr, "Record Type %s, Record Class %s, TTL %d\n", 
  483.                         TypeOfQuery[qptr->qType], TypeOfClass[qptr->qClass],
  484.                         qptr->ttl);
  485.                 switch (qptr->qType)
  486.                 {
  487.                     case kNSType:        // Name server, a domain name, compressed
  488.                     case kMDType:        // Mail domain (obsolete - use MX), compressed
  489.                     case kMFType:        // Mail forwarder (obsolete - use MX), compressed
  490.                     case kCNameType:    // Canonical name, compressed
  491.                     case kMBType:        // Mailbox domain name (experimental), compressed
  492.                     case kMGType:        // Mail group member (experimental), compressed
  493.                     case kMRType:        // Mailbox rename (experiemental), compressed
  494.                     case kPtrType:        // Ptr (domain name), compressed
  495.                         fprintf(stderr, "%s\n", qptr->resourceData);
  496.                         break;
  497.                         
  498.                     case kWKSType:         // Well-Known Services - IP addr, protocol, bitmask
  499.                     {    
  500.                         WKSEntry*    entry = (WKSEntry*)qptr->resourceData;
  501.                         UInt8*        tmpdata = (UInt8 *)(qptr->resourceData) +
  502.                                                         sizeof(UInt32) + sizeof(UInt8);
  503.                         
  504.                         fprintf(stderr, "IP Address %x, Protocol %s, Bitmask ",
  505.                                           *((UInt32 *)(entry->WKSAddr)), 
  506.                                           TypeOfProtocol[entry->WKSProto]);
  507.                         for (j = 0; j < (qptr->resourceLen - sizeof(UInt8) - sizeof(UInt32)); j++)
  508.                             fprintf(stderr, "%02x", *tmpdata++);
  509.                         fprintf(stderr, "\n");
  510.                         break;
  511.                     }
  512.                     
  513.                     case kMXType:
  514.                     {
  515.                         UInt16* pref = (UInt16 *)qptr->resourceData;
  516.                         char*    server = (char *)(qptr->resourceData) + sizeof (UInt16);
  517.                         fprintf(stderr, "Exchange = %s, Preference = %d\n", server, *pref);
  518.                         break;
  519.                     }
  520.                     
  521.                     case kHInfoType:
  522.                     {
  523.                         char* hstuff = qptr->resourceData;
  524.                         UInt8 slen = (UInt8)(*hstuff++);
  525.                         
  526.                         fprintf(stderr, "CPU Type ");
  527.                         for (j = 0; j< slen; j++)
  528.                             fprintf(stderr, "%c", *hstuff++);
  529.                         slen = (UInt8)(*hstuff++);
  530.                         fprintf(stderr, "\nO/S Type ");
  531.                         for (j = 0; j< slen; j++)
  532.                             fprintf(stderr, "%c", *hstuff++);
  533.                         fprintf(stderr, "\n");
  534.                         break;
  535.                     }
  536.                     
  537.                     case kAType:
  538.                     {
  539.                     
  540.                         fprintf(stderr, "Address = %d.%d.%d.%d \n",
  541.                                         (UInt8)qptr->resourceData[0], 
  542.                                         (UInt8)qptr->resourceData[1], 
  543.                                         (UInt8)qptr->resourceData[2], 
  544.                                         (UInt8)qptr->resourceData[3]);
  545.                         break;
  546.                     }
  547.                     
  548.                     default:
  549.                         for (j = 0; j < qptr->resourceLen; j++)
  550.                             fprintf(stderr, "%02x\n", (UInt8)(qptr->resourceData[j]));
  551.                 }
  552.                 fprintf(stderr, "\n");
  553.                 i++;
  554.                 qptr = *(((DNSQueryInfo**)gArgBuf) + i);
  555.             };
  556.             break;
  557.             
  558.         case kENOMEMErr:
  559.             fprintf(stderr, "Memory Depletion!\n");
  560.             break;
  561.             
  562.         case kEINVALErr:
  563.             fprintf(stderr, "Host Address Wrong Size! Shouldn't Happen In This Test!\n");
  564.             break;
  565.             
  566.         case kOTNoDataErr:
  567.             fprintf(stderr, "No Data Available! Either Timeout,or Name Exists But Requested Info Doesn't!\n");
  568.             break;
  569.             
  570.         case kOTBadNameErr:
  571.             fprintf(stderr, "Bad Name! Either Name Does Not Exist in Domains Examined, or Bad Syntax!\n");
  572.             break;
  573.             
  574.         default:
  575.             fprintf(stderr, "Unknown Error %d!\n", gTestResult);
  576.             break;
  577.     }
  578.     gCallCompleted = false;
  579.     gTestResult = kOTNoError;
  580. }
  581.  
  582. pascal void EventHandler(void*, OTEventCode, OTResult result, void*)
  583. {
  584.     gTestResult        = result;
  585.     gCallCompleted    = true;
  586.     return;
  587. }
  588.  
  589. int main()
  590. {
  591.     int            testtype;
  592.     int            retval    = 1;
  593.     char        mystr[kMaxHostNameLen];
  594.     char        datastr[kMaxHostNameLen];
  595.     InetHost    addr;
  596.     OSStatus    err;
  597.     
  598.     Inits();
  599.     fflush(stdout);
  600.     
  601.     do
  602.     {
  603.         gSvc = OTOpenInternetServices(kDefaultInternetServicesPath, NULL, &err);
  604.         if ( gSvc == NULL ||  err != kOTNoError )
  605.         {
  606.             fprintf(stderr,"Could not open Inet Services\n");
  607.             return retval;
  608.         }
  609.         /*
  610.          * Now install a notifier for async events
  611.          * and then go back to async mode.
  612.          */
  613.         err = gSvc->InstallNotifier((OTNotifyProcPtr)&EventHandler, 0);
  614.         if ( err != kOTNoError )
  615.         {
  616.             fprintf(stderr,"Install notifier failed\n");
  617.             return retval;
  618.         }
  619.         err = gSvc->SetAsynchronous();
  620.         if ( err != kOTNoError )
  621.         {
  622.             fprintf(stderr,"Could not set asynchronous mode on svc\n");
  623.             return retval;
  624.         }
  625.     
  626.         do
  627.         {
  628.             fprintf(stderr, "Select a DNR operation. \n Enter '1' for StringToAddress, \n '2' for AddressToName, \n '3' for SysInfo, \n '4' for MailExchange, \n '5' for Generic Query, \n or 'q' to quit. \n");
  629.             if ( gets(mystr) != 0 ) 
  630.             {
  631.                 if ( strcmp(mystr, "1") == 0 )
  632.                     testtype = kStrToAddrTest;
  633.                 else if ( strcmp(mystr, "2") == 0 )
  634.                     testtype = kAddrToNameTest;
  635.                 else if ( strcmp(mystr, "3") == 0 )
  636.                     testtype = kSysInfoTest;
  637.                 else if ( strcmp(mystr, "4") == 0 )
  638.                     testtype = kMXTest;
  639.                 else if ( strcmp(mystr, "5") == 0 )
  640.                     testtype = kQueryTest;
  641.                 else if ( strcmp(mystr, "q") == 0 )
  642.                     break;
  643.                 else 
  644.                 {
  645.                     fprintf(stderr, "Invalid character entered. Please try again.\n");
  646.                     continue;
  647.                 }
  648.             }
  649.             switch ( testtype )
  650.             {
  651.                 case kStrToAddrTest:
  652.                 
  653.                     fprintf(stderr, "StringToAddr Test. Please enter a name to resolve...\n"); 
  654.                     if ( gets(mystr) != 0 ) 
  655.                         DoStrToAddr(mystr);
  656.                     else
  657.                         fprintf(stderr, "Couldn't get name from window!\n");
  658.                     break;
  659.     
  660.                 case kAddrToNameTest:
  661.                     fprintf(stderr, "AddressToName Test. Please enter an address to resolve...\n"); 
  662.                     if ( gets(mystr) != 0 ) 
  663.                     {
  664.                         OTInetStringToHost(mystr, &addr);
  665.                         DoAddrToName(addr);
  666.                     }
  667.                     break;
  668.                     
  669.                 case kSysInfoTest:
  670.                     fprintf(stderr, "SysInfo Test. Please enter a name to resolve...\n"); 
  671.                     if ( gets(mystr) != 0 ) 
  672.                         DoSysInfo(mystr);
  673.                     else
  674.                         fprintf(stderr, "Couldn't get name from window!\n");
  675.                     break;
  676.                     
  677.                 case kMXTest:
  678.                     fprintf(stderr, "Mail Exchange Test. Please enter a name to resolve...\n"); 
  679.                     if ( gets(mystr) != 0 ) 
  680.                         DoMailExchange(mystr);
  681.                     else
  682.                         fprintf(stderr, "Couldn't get name from window!\n");
  683.                     break;
  684.                     
  685.                 case kQueryTest:
  686.                 
  687.                 {
  688.                     UInt16    queryClass; 
  689.                     UInt16    queryType; 
  690.                 
  691.                     fprintf(stderr, "Generic Query Test. Please enter a name to resolve...\n"); 
  692.                     if ( gets(mystr) == 0 )
  693.                     {
  694.                         fprintf(stderr, "Couldn't get name from window!\n");
  695.                         break;
  696.                     }
  697.                     fprintf(stderr, "Please enter the query class (1 for INET; 255 or '*' For All Classes)...\n"); 
  698.                     if ( gets(datastr) == 0 )
  699.                     {
  700.                         fprintf(stderr, "Couldn't get class from window!\n");
  701.                         break;
  702.                     }
  703.                     if (*datastr == '*')
  704.                         queryClass = kWIldCardType;
  705.                     else
  706.                         queryClass = (UInt16)(atoi(datastr));
  707.                     fprintf(stderr, "Please enter the query type (1 through 254; 255 or '*' For All Types)...\n"); 
  708.                     if ( gets(datastr) == 0 )
  709.                     {
  710.                         fprintf(stderr, "Couldn't get type from window!\n");
  711.                         break;
  712.                     }
  713.                     if (*datastr == '*')
  714.                         queryType = kWIldCardType;
  715.                     else
  716.                         queryType = (UInt16)(atoi(datastr));
  717.                     DoGenericQuery(mystr, queryClass, queryType);
  718.                     break;
  719.                 }
  720.     
  721.                 default:
  722.                     break;
  723.                 
  724.             }
  725.         } while (true);
  726.     } while ( false );
  727.     
  728.     fprintf(stderr, "Tests Completed.\n");
  729.     
  730.     if ( gSvc != NULL )
  731.         gSvc->Close();
  732.  
  733.     return retval;
  734. }
  735.  
  736.  
  737.